#include "management.h"


/*
    创建数据库函数，根据红定义的名称
    #define MEMSQ "datamembase"         //数据库名字
    #define ADMINIUR "adminiusermsg"    //管理员用户名密码表名称
    #define DOMEUR "domeusermsg"         //普通用户名密码表
    #define MEMINFO "membermsg"          //员工信息表
    创建一个数据库，三个表
    返回值：成功返回1，失败返回0
*/
int Sq_create()
{
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg;
    int recode;


    recode = sqlite3_open(MEMSQ,&db);//创建和打开数据库
    if(recode !=SQLITE_OK)
    {
        printf("error: %s\n", sqlite3_errmsg(db));
    }
   
    sprintf(sql,"create table %s(name char primary key, passwd char)",ADMINIUR);
    //填充数据库操作命令 sql语句
    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
    //通过exec函执行sql语句，完成表的创建
    if( recode != SQLITE_OK)
    {
        printf("creat table error:%s\n",errmsg);
    }

    memset(sql,0,sizeof(sql)); //清空sql数组，准备重新赋值

    sprintf(sql,"create table %s(name char primary key, passwd char)",DOMEUR);

    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);//创建第二张表
    if( recode != SQLITE_OK)
    {
        printf("creat table error:%s\n",errmsg);
    }

    memset(sql,0,sizeof(sql));
    sprintf(sql,"create table %s(number int primary key,name char,old int,sex char,salary int)",MEMINFO);
    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);//创建第三张表
    if( recode != SQLITE_OK)
    {
        printf("creat table error:%s\n",errmsg);
    }
    sqlite3_close(db);
    return 1;
}

/*
    向管理员用户名密码表中插入数据
    参数：客户端信息结构体
    返回值：成功返回1，失败返回0，用户名已存在返回2
*/
int Sq_install_AD(struct clmsg msdata)
{       
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg;
    int recode;

    recode=sqlite3_open(MEMSQ,&db);      //打开数据库
    if(recode !=SQLITE_OK)               //判断数据库打开是否成功
    {
         printf("error: %s\n", sqlite3_errmsg(db)); //打印错误信息
    }

    sprintf(sql,"insert into %s values('%s','%s')",ADMINIUR,msdata.us_name,msdata.us_pswd);
    //组装sql语句

    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
    if( recode != SQLITE_OK)
    {
        if(recode == 19) //返回值为19时，代表插入的内容与设定好的限制键冲突，意味着插入的内容已经存在
        {
            sqlite3_close(db); //关闭数据库
            return 2;
        }
        else
        {
            printf("Install AD error:%s\n",errmsg);
            sqlite3_close(db);
            return 0;
        }
        
    }

    sqlite3_close(db);

    return 1;

}

/*
    向普通用户名密码表中插入数据
    参数：客户端信息结构体
    返回值：成功返回1，失败返回0，用户名已存在返回2
*/
int Sq_install_DM(struct clmsg msdata)
{
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg;
    int recode;

    
    recode = sqlite3_open(MEMSQ,&db);
    if(recode !=SQLITE_OK)
    {
         printf("error: %s\n", sqlite3_errmsg(db));
    }

    sprintf(sql,"insert into %s values('%s','%s')",DOMEUR,msdata.us_name,msdata.us_pswd);
    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
    if(recode != SQLITE_OK)
    {
        if(recode == 19)
        {
            sqlite3_close(db);
            return 2;
        }
        else
        {
            printf("Install DM error:%s\n",errmsg);
            sqlite3_close(db);
            return 0;
        }
       
    }

    sqlite3_close(db);
    return 1;

}

/*
    检查用户名密码是否存在于普通用户名密码表中
    参数：客户端信息结构体
    返回值：存在返回1，不存在或失败返回0
*/
int Sq_check_DM(struct clmsg msdata)
{
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg;
    int recode;
    char **redata;
    int row=0,col=0;


    recode=sqlite3_open(MEMSQ,&db);
    if(recode !=SQLITE_OK)
    {
         printf("error: %s\n", sqlite3_errmsg(db));
    }

    sprintf(sql,"select * from %s where name='%s' and passwd='%s'",DOMEUR,msdata.us_name,msdata.us_pswd);
    recode = sqlite3_get_table(db,sql,&redata,&row,&col,&errmsg);
    //sqlite3_get_table函数会开辟空间并将查询结果放入 radata关联结果空间 
    if(recode != SQLITE_OK)
    {
        printf("Check DM error:%s\n",errmsg);
        sqlite3_close(db);
        return 0;
    }
    sqlite3_free_table(redata);//释放内存
    sqlite3_close(db);
    if(row > 0)  //判断查询到的结果的条数来判断是否查询到数据
    {
        return 1;
    }
    else
    {
        return 0;
    }

}


/*  检查用户名密码是否存在于管理员用户名密码表中
    参数：客户端信息结构体
    返回值：存在返回1，不存在或失败返回0  */
int Sq_check_AD(struct clmsg msdata)
{
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg;
    int recode;
    char **redata;
    int row=0,col=0;

    recode=sqlite3_open(MEMSQ,&db);
    if(recode !=SQLITE_OK)
    {
         printf("error: %s\n", sqlite3_errmsg(db));
    }

    sprintf(sql,"select * from %s where name='%s' and passwd='%s'",ADMINIUR,msdata.us_name,msdata.us_pswd);
    recode = sqlite3_get_table(db,sql,&redata,&row,&col,&errmsg);
    if(recode != SQLITE_OK)
    {
        printf("Check AD error:%s\n",errmsg);
        sqlite3_close(db);
        return 0;
    }
    sqlite3_free_table(redata);
    sqlite3_close(db);
    if(row > 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


/*
    查询员工信息表  
    每次成功接收并使用完data数据后都必须调用 sqlite3_free_table(data) 函数释放data的空间
    参数：数据指针（用于保存查询到的所有数据 char **）
         行指针 （用于保存查询到的信息的行数 int *）
         列指针  (用于保存查询到的信息的列数)
    返回值：成功返回1，失败返回0
*/
int Sq_show_MEM(char ***data,int *nrow,int *ncolumn)
{
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg = NULL;
    int recode;

    recode=sqlite3_open(MEMSQ,&db);
    if(recode != SQLITE_OK)
    {
         printf("error: %s\n", sqlite3_errmsg(db));
    }

    sprintf(sql,"select * from %s ",MEMINFO);  //查询所有信息
    recode = sqlite3_get_table(db,sql,data,nrow,ncolumn,&errmsg);
    //sqlite3_get_table函数会开辟空间平赋值给redata  中保存所有的结果，
    //nrow ncolumn保存二级指针的行与列的数量
    if(recode != SQLITE_OK)
    {
        printf("Check AD error:%s\n",errmsg);
        sqlite3_close(db);
        return 0;
    }

    sqlite3_close(db);
    return 1;
}


/*
    修改员工信息
    参数：客户端信息结构体
    返回值：成功返回1，失败返回0
*/
int Sq_change_MEM(struct clmsg msdata)
{
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg = NULL;
    int recode;

    recode=sqlite3_open(MEMSQ,&db);
    if(recode != SQLITE_OK)
    {
         printf("error: %s\n", sqlite3_errmsg(db));
    }

    sprintf(sql,"update %s set name='%s' old=%d sex='%c' salary=%d where number=%d",MEMINFO,msdata.member.name,msdata.member.old,msdata.member.sex,msdata.member.salary,msdata.member.number);
    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
    if(recode != SQLITE_OK)
    {
        printf("Change MEM error:%s\n",errmsg);
        sqlite3_close(db);
        return 0;
    }
    sqlite3_close(db);
    return 1;

}


/*
    插入员工信息
    参数：客户端信息结构体
    返回值：成功返回1，失败返回0，工号已存在返回2
*/
int Sq_install_MEM(struct clmsg msdata)
{
    sqlite3 *db;
    char sql[128]={0};
    char *errmsg = NULL;
    int recode;

    recode=sqlite3_open(MEMSQ,&db);
    if(recode != SQLITE_OK)
    {
         printf("error: %s\n", sqlite3_errmsg(db));
    }

    sprintf(sql,"insert into %s values(%d,'%s',%d,'%c',%d)",MEMINFO,msdata.member.number,msdata.member.name,msdata.member.old,msdata.member.sex,msdata.member.salary);
    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
    if(recode != SQLITE_OK)
    {
        if(recode == 19)
        {
            sqlite3_close(db);
            return 2;
        }
        printf("Install MEM error:%s\n",errmsg);
        sqlite3_close(db);
        return 0;
    }
    sqlite3_close(db);
    return 1;

}


/*
    删除员工信息（通过工号删除）
    参数：客户端信息结构体
    返回值：成功返回1，失败返回0
*/
int Sq_del_MEM(struct clmsg msdata)
{
     sqlite3 *db;
    char sql[128]={0};
    char *errmsg = NULL;
    int recode;

    recode=sqlite3_open(MEMSQ,&db);
    if(recode != SQLITE_OK)
    {
         printf("error: %s\n", sqlite3_errmsg(db));
    }

    sprintf(sql,"delete from %s where number=%d",MEMINFO,msdata.member.number);
    recode = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
    if(recode != SQLITE_OK)
    {
        printf("Delete MEM error:%s\n",errmsg);
        sqlite3_close(db);
        return 0;
    }
    sqlite3_close(db);
    return 1;
}

